package servlets;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import main.java.aplicacion.systemfactory.SystemFactory;
import main.java.aplicacion.usuarios.excepciones.UsuarioError;
import main.java.aplicacion.usuarios.interfaces.UsuariosMgt;
import main.java.datatypes.juegos.JuegoVO;
import main.java.datatypes.juegos.VersionVO;
import main.java.datatypes.usuarios.ClienteVO;
import main.java.datatypes.usuarios.DesarrolladorVO;
import main.java.datatypes.usuarios.UsuarioVO;

/**
 * Servlet implementation class PerfilServlet
 */
public class PerfilServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    private String filePath;
    /**
     * @see HttpServlet#HttpServlet()
     */
    public PerfilServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    @Override
	public void init() throws ServletException {
		filePath = getServletContext().getInitParameter("subdirArchivos"); 
	}
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		if(request.getServletPath().equals("/perfiles/validarNick")){
			UsuariosMgt umg = SystemFactory.getInstance().getUsuarioMgt();
			response.setContentType("text/plain");
		    response.setCharacterEncoding("UTF-8");
		    response.getWriter().write("Nick " + (umg.existeUsuarioNick(request.getParameter("nick"))?"ya utilizado.": "libre.")); 
		}else if(request.getServletPath().equals("/perfiles/validarCorreo")){
			UsuariosMgt umg = SystemFactory.getInstance().getUsuarioMgt();
			response.setContentType("text/plain");
		    response.setCharacterEncoding("UTF-8");
		    response.getWriter().write("Correo " + (umg.existeUsuarioCorreo(request.getParameter("correo"))?"ya utilizado.": "libre.")); 
		} else if(request.getServletPath().equals("/perfiles/altaPerfil")){
		    request.getRequestDispatcher("/perfiles/altaPerfil.jsp").forward(request, response);
		} else if(request.getServletPath().equals("/perfiles/consultaPerfil")){
			UsuariosMgt umg = SystemFactory.getInstance().getUsuarioMgt();
			String nick = (String) request.getSession().getAttribute("usuario");
			Boolean desarrollador = (Boolean) request.getSession().getAttribute("desarrollador");
			Map<String, String> usuAux = new HashMap<String, String>();
			if(desarrollador.booleanValue()){
				try {
					DesarrolladorVO des = (DesarrolladorVO) umg.mostrarDatos(nick);
					SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
					usuAux.put("nick", des.getNick());
					usuAux.put("correo", des.getMail());
					usuAux.put("nombre", des.getNombre());
					usuAux.put("apellido", des.getApellido());
					usuAux.put("fecha", dateformat.format(des.getFechaNacimiento()));
					usuAux.put("edad", String.valueOf(des.getEdad()));
					usuAux.put("sitio", des.getLink());
					List<VersionVO> verAux = new ArrayList<VersionVO>();
					for(JuegoVO juego : des.getJuegosPublicados()){
						for(VersionVO ver : juego.getVersiones()){
							if(!ver.getEstado().equals("Aprobada"))
								verAux.add(ver);
						}
					}
					request.setAttribute("verAux", verAux);
				} catch (UsuarioError e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}else{
				try {
					ClienteVO cli = (ClienteVO) umg.mostrarDatos(nick);
					SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
					usuAux.put("nick", cli.getNick());
					usuAux.put("correo", cli.getMail());
					usuAux.put("nombre", cli.getNombre());
					usuAux.put("apellido", cli.getApellido());
					usuAux.put("fecha", dateformat.format(cli.getFechaNacimiento()));
					usuAux.put("edad", String.valueOf(cli.getEdad()));
				} catch (UsuarioError e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			request.setAttribute("usuAux", usuAux);
			request.getRequestDispatcher("/perfiles/consultaPerfil.jsp").forward(request, response);
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		if(request.getServletPath().equals("/perfiles/altaPerfil")){
			DiskFileItemFactory factory = new DiskFileItemFactory(4096 * 1024, new File("/temp"));
			ServletFileUpload upload = new ServletFileUpload(factory);
		     upload.setSizeMax( 8192 * 1024 );
		     Map<String, String> parametros = new HashMap<String, String>();
		      
		      try{ 
		      // Parse the request to get file items.
		      @SuppressWarnings("unchecked")
			List<FileItem> fileItems = upload.parseRequest(request);
			
		      // Process the uploaded file items
		      Iterator<FileItem> i = fileItems.iterator();

		      File file;
		      
		      while ( i.hasNext () ) 
		      {
		         FileItem fi = (FileItem)i.next();
		         if ( !fi.isFormField () )	
		         {
		            // Get the uploaded file parameters
		            String fieldName = fi.getFieldName();
		            String fileName = fi.getName();
		            String contentType = fi.getContentType();
		            boolean isInMemory = fi.isInMemory();
		            long sizeInBytes = fi.getSize();
		            // Write the file
		            file = new File(filePath, fileName) ;
		            
		            fi.write( file ) ;
		            
		         }
		         else{
		        	 parametros.put(fi.getFieldName(), fi.getString());
		         }
		      }
		     
		   }catch(Exception ex) {
		       System.out.println(ex);
		   }
			UsuariosMgt umg = SystemFactory.getInstance().getUsuarioMgt();
			String tipoperfil = parametros.get("tipoperfil");
			UsuarioVO dtusu;
			String nick = parametros.get("nick");
			String mail = parametros.get("correo");
			String nombre = parametros.get("nombre");
			String apellido = parametros.get("apellido");
			String contrasenia = parametros.get("contrasenia");
			String sitio = parametros.get("sitio");
			String[] dma = parametros.get("fecha").split("/");
			Date date = java.sql.Date.valueOf(dma[2] + "-" + dma[1]+ "-" + dma[0]);
			if(tipoperfil.equals("cliente")){
				dtusu = new ClienteVO(nick, mail, nombre, apellido, date, 0, "", contrasenia);
			}else{
				dtusu = new DesarrolladorVO(nick, mail, nombre, apellido, date, 0, "", sitio, contrasenia);
			}
			try {
				umg.agregarUsuario(dtusu);
			} catch (UsuarioError e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}			
			request.getRequestDispatcher("/WEB-INF/inicio.jsp").forward(request, response);
			
		}else if(request.getServletPath().equals("/perfiles/modificaPerfil")){
			DiskFileItemFactory factory = new DiskFileItemFactory(4096 * 1024, new File("/temp"));
			ServletFileUpload upload = new ServletFileUpload(factory);
		     upload.setSizeMax( 8192 * 1024 );
		     Map<String, String> parametros = new HashMap<String, String>();
		      
		      try{ 
		      // Parse the request to get file items.
		      @SuppressWarnings("unchecked")
			List<FileItem> fileItems = upload.parseRequest(request);
			
		      // Process the uploaded file items
		      Iterator<FileItem> i = fileItems.iterator();

		      File file;
		      
		      while ( i.hasNext () ) 
		      {
		         FileItem fi = (FileItem)i.next();
		         if ( !fi.isFormField () )	
		         {
		            // Get the uploaded file parameters
		            String fieldName = fi.getFieldName();
		            String fileName = fi.getName();
		            String contentType = fi.getContentType();
		            boolean isInMemory = fi.isInMemory();
		            long sizeInBytes = fi.getSize();
		            // Write the file
		            file = new File(filePath, fileName) ;
		            
		            fi.write( file ) ;
		            
		         }
		         else{
		        	 parametros.put(fi.getFieldName(), fi.getString());
		         }
		      }
		     
		   }catch(Exception ex) {
		       System.out.println(ex);
		   }
		      String nickOrigen = (String) request.getSession().getAttribute("usuario");
		      Boolean desarrollador = (Boolean) request.getSession().getAttribute("desarrollador");
				
		      UsuariosMgt umg = SystemFactory.getInstance().getUsuarioMgt();
		      String tipoperfil = parametros.get("tipoperfil");
		      UsuarioVO dtusu;
		      String nick = parametros.get("nick");
		      String mail = parametros.get("correo");
		      String nombre = parametros.get("nombre");
		      String apellido = parametros.get("apellido");
		      String contrasenia = null;
		      if(parametros.containsKey("cambiapass"))
		    	  contrasenia = parametros.get("contrasenia");
		      String sitio = parametros.get("sitio");
		      String[] dma = parametros.get("fecha").split("/");
		      Date date = java.sql.Date.valueOf(dma[2] + "-" + dma[1]+ "-" + dma[0]);
		      if(!desarrollador.booleanValue()){
		    	  if(contrasenia != null)
		    		  dtusu = new ClienteVO(nick, mail, nombre, apellido, date, 0, "", contrasenia);
		    	  else
		    		  dtusu = new ClienteVO(nick, mail, nombre, apellido, date, 0, "", "");
		    		  
		      }else{
		    	  if(contrasenia != null)
		    		  dtusu = new DesarrolladorVO(nick, mail, nombre, apellido, date, 0, "", sitio, contrasenia);
		    	  else
		    		  dtusu = new DesarrolladorVO(nick, mail, nombre, apellido, date, 0, "", sitio, "");
		      }
		      try {
		    	  umg.modificarPerfilUsuario(nickOrigen, "", dtusu);
		      } catch (UsuarioError e) {
				// TODO Auto-generated catch block
		    	  e.printStackTrace();
		      }			
			request.getRequestDispatcher("/WEB-INF/inicio.jsp").forward(request, response);
		}
			
			
	}

}
